package com.rui.cn.consumer.web;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.rui.cn.dto.JsonResult;
import com.rui.cn.dto.TreeDto;
import com.rui.cn.entity.system.SysPermission;
import com.rui.cn.feignservice.SysPermissionService;
import com.rui.cn.feignservice.SysRolePermissionService;
import com.rui.cn.util.MenuUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

import java.util.*;

/**
*@描述：权限管理控制器类
*@创建人：[zhang]
*@类名：PermissionController
*@时间：2018/4/28 0028-下午 17:05
**/

@RestController
@RequestMapping("/permission")
public class PermissionController {

    @Autowired
    private SysPermissionService sysPermissionService;
    @Autowired
    private SysRolePermissionService sysRolePermissionService;
    /**
    *@ 描述：权限页面
    *@ 方法名：toPermisson
    *@ 参数：[]
    *@ 返回值类型：org.springframework.web.servlet.ModelAndView
    *@ 创建人：[zhang]
    *@ 创建时间：2018/4/28 0028-下午 17:06
    **/
    @RequestMapping("/toPermiss")
    public ModelAndView toPermisson(){
       return new ModelAndView("system/permission");
    }

    /**
     *@ 描述：根绝权限id获取父节点兄弟节点
     *@ 方法名：permissionList
     *@ 参数：[id]
     *@ 返回值类型：com.rui.cn.dto.JsonResult
     *@ 创建人：[zhang]
     *@ 创建时间：2018/4/30 0030-下午 22:15
     **/
    @RequestMapping("/permissionList")
    public JsonResult permissionList(String id){
        List<SysPermission> menuList;
        if(StringUtils.isBlank(id)){
            menuList=sysPermissionService.selectList();
        }else {
            menuList=sysPermissionService.selectByIdOrParentId(id);
        }
        List<SysPermission> returnMenus= MenuUtil.sortedPermisList(0,menuList);
        JsonResult jsonResult=new JsonResult(returnMenus);
        return jsonResult;
    }
    /**
     *@ 描述：获取权限树
     *@ 方法名：roleList
     *@ 参数：[pagination, recPerPage, page, search, sortBy, order]
     *@ 返回值类型：com.rui.cn.dto.RemotePage
     *@ 创建人：[zhang]
     *@ 创建时间：2018/4/28 0028-下午 15:18
     **/
    @RequestMapping(value = "/getpermisTreeData")
    public List<TreeDto> getpermisTreeData(Integer id){
        List<TreeDto> treeList = new ArrayList<TreeDto>();
        treeList.add(new TreeDto(0,-1,"系统权限"));
        //查询所有权限
        List<SysPermission> permissionList=sysPermissionService.selectList();
        for(SysPermission per : permissionList){
            TreeDto tree = new TreeDto();
            tree.setId(per.getId());
            tree.setTitle(per.getRemark());
            tree.setParentid(per.getParentid());
            treeList.add(tree);
        }
        //如果是进入修改页面,为放置死循环 ,我们必须本节点以及本节点所有的儿子,孙子,全部过滤掉
        //1:把他的儿子,孙子全部找出来
        //2:把他的儿子,孙子从列表里面remove
        if(id!=null){//代表进入的是修改页面
            Map<Integer,TreeDto> childrenMap = new HashMap<Integer,TreeDto>();
            //1:把他的儿子,孙子全部找出来
            MenuUtil.getAllChildrenMap(childrenMap, treeList, id);
            //2:把他的儿子,孙子从列表里面remove
            Iterator<TreeDto> treeIterator = treeList.iterator();
            while(treeIterator.hasNext()){
                TreeDto tree = treeIterator.next();
                //如果子节点列表里面存在这个对象,则删除
                if(childrenMap.get(tree.getId())!=null){
                    treeIterator.remove();
                }
                //删除本身
                if(tree.getId().equals(id)){
                    treeIterator.remove();
                }
            }
        }
        return treeList;
    }
    /**
     *@ 描述：添加修改权限
     *@ 方法名：addOrupdate
     *@ 参数：[permission]
     *@ 返回值类型：com.rui.cn.dto.JsonResult
     *@ 创建人：[zhang]
     *@ 创建时间：2018/4/30 0030-上午 0:30
     **/
    @RequestMapping("/addOrupdate")
    public JsonResult addOrupdate(SysPermission permission){
        boolean flag=sysPermissionService.insertOrUpdate(permission);
        return  new JsonResult(flag?1:0);
    }
    /**
     *@ 描述：权限详情
     *@ 方法名：loadPermission
     *@ 参数：[id]
     *@ 返回值类型：com.rui.cn.dto.JsonResult
     *@ 创建人：[zhang]
     *@ 创建时间：2018/4/30 0030-上午 0:35
     **/
    @RequestMapping("/loadPermission")
    public JsonResult loadPermission(Integer id,Integer parentid){
        JsonResult result=new JsonResult();
        if(id == null){
            result.setMsg("必须选择一个菜单！");
            result.setState(0);
            return  result;
        }
        SysPermission permission =null;
        if(parentid == 0){//顶级菜单
            permission=sysPermissionService.selectById(id);
            permission.setParentName("系统权限");
        }else {
            permission=sysPermissionService.getPermissionInfo(id);
        }
        return  new JsonResult(permission);
    }
    /**
     *@ 描述：删除权限
     *@ 方法名：delPermission
     *@ 参数：[id]
     *@ 返回值类型：com.rui.cn.dto.JsonResult
     *@ 创建人：[zhang]
     *@ 创建时间：2018/4/30 0030-上午 0:47
     **/
    @RequestMapping("/delPermission")
    public JsonResult delPermission(Integer id){
        boolean flag;
        JsonResult result= new JsonResult();
        if(id == null){
            result.setMsg("必须选择一个权限！");
            result.setState(0);
            return  result;
        }
        List<SysPermission> menuList=sysPermissionService.selectByParentId(id);
        if(menuList.size()>0){
            result.setMsg("请确定删除所有的子权限后再进行此操作!");
            result.setData(0);
            return  result;
        }else {
            //删除权限
            flag= sysPermissionService.deleteBatchIds(Arrays.asList(id));
            //删除角色权限
            Map<String,Object> map=null;
            map=new HashMap<>();
            map.put("pid",id);
            sysRolePermissionService.deleteByMap(map);
        }
        return new JsonResult (flag?1:0);
    }
}
